package com.xiepei.day01;

/**
 * Main类 - Java面向对象编程综合演示
 * 包含：封装、继承、接口、多态四个核心概念
 */
public class Main {
    public static void main(String[] args) {
        System.out.println("🎓 欢迎学习Java面向对象编程！");
        System.out.println("=====================================\n");
        
        // 演示封装
        demonstrateEncapsulation();
        
        // 演示继承
        demonstrateInheritance();
        
        // 演示接口
        demonstrateInterface();
        
        // 演示多态
        demonstratePolymorphism();
        
        System.out.println("🎉 恭喜你完成了Java面向对象编程的学习！");
        System.out.println("记住四个核心概念：");
        System.out.println("1. 封装 (Encapsulation) - 数据隐藏");
        System.out.println("2. 继承 (Inheritance) - 代码复用");
        System.out.println("3. 接口 (Interface) - 契约定义");
        System.out.println("4. 多态 (Polymorphism) - 同一接口不同实现");
    }
    
    /**
     * 演示封装概念
     */
    private static void demonstrateEncapsulation() {
        System.out.println("📦 1. 封装 (Encapsulation) 演示");
        System.out.println("封装：将数据和方法包装在一起，隐藏内部实现细节");
        System.out.println("----------------------------------------");
        
        Person person = new Person("小明", 20, "男");
        
        // 通过公共方法访问私有属性
        System.out.println("姓名：" + person.getName());
        System.out.println("年龄：" + person.getAge());
        System.out.println("性别：" + person.getGender());
        
        // 通过公共方法修改属性（带验证）
        person.setAge(21);
        person.setName("小明同学");
        
        person.introduce();
        person.haveBirthday();
        
        System.out.println("✅ 封装的好处：数据安全、易于维护、隐藏复杂性\n");
    }
    
    /**
     * 演示继承概念
     */
    private static void demonstrateInheritance() {
        System.out.println("👨‍👩‍👧‍👦 2. 继承 (Inheritance) 演示");
        System.out.println("继承：子类继承父类的属性和方法，实现代码复用");
        System.out.println("----------------------------------------");
        
        Student student = new Student("小红", 19, "女", "2023001", "计算机科学", 3.8);
        
        // 继承父类的方法
        student.introduce(); // 重写了父类方法
        student.haveBirthday(); // 继承父类方法
        
        // 子类特有的方法
        student.study();
        student.takeExam();
        student.updateGpa(3.9);
        
        System.out.println("✅ 继承的好处：代码复用、层次结构、易于扩展\n");
    }
    
    /**
     * 演示接口概念
     */
    private static void demonstrateInterface() {
        System.out.println("📋 3. 接口 (Interface) 演示");
        System.out.println("接口：定义方法契约，实现类必须提供具体实现");
        System.out.println("----------------------------------------");
        
        Teacher teacher = new Teacher("张老师", 35, "男", "T001", "Java编程", 10);
        
        // 实现接口方法
        teacher.learn();
        teacher.takeNotes();
        teacher.review(); // 默认方法
        
        // 调用接口静态方法
        System.out.println("\n学习建议：");
        Learnable.showLearningTips();
        
        System.out.println("✅ 接口的好处：规范行为、多重实现、解耦合\n");
    }
    
    /**
     * 演示多态概念
     */
    private static void demonstratePolymorphism() {
        System.out.println("🔄 4. 多态 (Polymorphism) 演示");
        System.out.println("多态：同一接口，不同实现；运行时决定调用哪个方法");
        System.out.println("----------------------------------------");
        
        // 创建不同类型的对象
        Person person = new Person("普通人", 25, "男");
        Student student = new Student("学生", 20, "女", "2023002", "软件工程", 3.5);
        Teacher teacher = new Teacher("老师", 40, "男", "T002", "数据结构", 15);
        
        // 多态数组
        Person[] people = {person, student, teacher};
        
        System.out.println("多态调用introduce方法：");
        for (Person p : people) {
            p.introduce(); // 运行时多态
        }
        
        System.out.println("\n接口多态演示：");
        Learnable[] learners = {student, teacher};
        for (Learnable learner : learners) {
            learner.learn(); // 接口多态
            learner.takeNotes();
        }
        
        System.out.println("✅ 多态的好处：灵活性、可扩展性、代码简洁\n");
    }
}

